MODELOS PREDICTIVOS COVID MURCIA

Lectura del conjunto de datos obtenido de la pagina de salud de Murcia https://www.murciasalud.es/pagina.php?id=458869 Recogidos desde el 08/03/2020 hasta el dia 25/03/2020

Renombramos los nombres de algunas de las columnas para que queden mas compactos

Convertimos los datos leidos en un dataFrame y lo mostramos para ver su apariencia

Lo siguiente que haremos es indexar el dataframe por la columna 'Fecha'. Para ello, primero debemos convertir la misma en un objeto de tipo DatatimeIndex. Usamos la funcion 'to_datetime' y le indicamos el formato en el que se encuentran las fechas para que se lea y procese bien. Posteriormente eliminamos la columna del dataFrame e insertamos el nuevo DatatimeIndex como íncide del dataframe. Finalmente mostramos el resultado.

Con la siguiente función eliminamos todos aquellos valores que se almacenan o completan como NaN.

Sumando sintomáticos y asintomáticos

Sumamos asintomáticos y sintomáticos. Eliminamos los grupos y nos quedamos con el total de cada uno

A continuación lo que hacemos es guardarla en un archivo de extensión .csv

Al igual que hicimos con el dataFrame de los datos de salud que leímos al principio, debemos transformar las fechas en objetos de tipo DatatimeIndex. Posteriormente las ordenaremos para que se muestren en orden cronológico. Para ello usamos la función 'to_datetime', que convierte nuestra lista de fechas en DatatimeIndex. Acto seguido creamos el dataframe con las entradas, las salidas a Murcia y las fechas y las ponemos como índice del dataframe. Ahora solo queda ordenarlo. Añadimos tres columnas adicionales al dataframe que son los meses, dias y años de las fechas. Ordenamos según estos valores y posteriormente las eliminamos del dataframe. Mostramos el resultado.

Añadiendo Movilidad

Necesitamos añadir los datos de movilidad proporcionados por el Ministerio de Transporte y Movilidad en la Región de Murcia. Para ello se buscaron los códigos de los municipios murcianos así como sus correspondientes códigos para el Ministerio, ya que no siempre coinciden.

La siguiente función permite parsear las fechas, a partir del nombre del fichero obtenemos la fecha correspondiente

La lista "codigos" contiene todos los códigos de los municipios de la Región con la codificación usada por el Ministerio

Lo siguiente que haremos es procesar todos los datos que tenemos. Para cada archivo, nos quedamos con las salidas y entradas en la Región de Murcia, esto es, no se considera la movilidad entre distintos municipios murcianos si no las salidas y entradas de municipios fuera de la Región hacia ella o desde municipios de la Región hasta municipios fuera de ella

Convertimos los datos recogidos en un dataframe mediante la función definida anteriormente

Vemos ahora el número de filas y el número de missing values

Guardamos el conjunto de datos con la movilidad en un nuevo archivo csv

Juntando los datos

En este apartado se juntan los dataframe de las dos fuentes de datos que se han procesado. De esta forma, a los datos de salud se le añaden los datos de movilidad

Contamos de nuevo las filas y el número de missing values y los eliminamos

Visualización de series

Creación de predictores

La siguiente función crea un predictor con el lag que se le pase como parámetro sobre el conjunto de datos

Creamos dos predictores, uno con lag3 y otro con lag5

Normalización de los predictores

Utilizamos la función MaxMinScaler para normalizar el conjunto de datos entre 0 y 1

Escalamos los predictores de lag3 y lag5 calculados anteriormente

Predictor lag3 escalado

Predictor lag5 escalado

Predicción

Usamos el cross validator de time series con 10 pliegues

La siguiente función busca los mejores hiperparámetros usando como medida de error RMSE

Cálculo de errores MAE, RMSE

Función para calcular la gráfica de comparación entre incidentes reales y predecidos en el instante t+i

Función para el cálculo de las predicciones 7 días adelante a partir de la predicción t para el modelo indicado

Función para calcular los errores y las gráficas asociadas a las predicciones realizadas en la función anterior

Visualización de todas las predicciones juntas

División del conjunto de datos

Dividimos el conjunto de datos con una distribución 80% para train y 20% para test sin perder la temporalidad

El caso de lag3 el conjunto de datos es de 355x28. El 80% de las filas son 355x0'8 = 284 mientras que el 20% son 355x0'2 = 71 así que tendremos 284 muestras para train y 71 para test

En el caso de lag5 el conjunto de datos es de 353x28. El 80% de las filas son 353x0'8 = 282'4 -> 282 mientras que el 20% son 353x0'2 = 70'6 así que por el redondeo, tendremos 282 muestras para train y 71 para test

Random Forest

Lo siguiente que hacemos es hacer la búsqueda de hiperparámetros, para ello usaremos GridSearchCV, que prueba todas las posibles combinaciones de parámetros que se le pase usando crossvalidación. Veamos cuáles son los hiperparámetros de RF y sus valores por defecto

Lag 3

Predicción t

Predicción 7 días adelante

Lag 5

Predicción t

Predicción 7 días adelante

Linear Regression

Lag 3

Predicción t

Predicción 7 días adelante

Creamos una lista donde irán las predicciones t+i con i = 1,...,7

Calculamos las gráficas de las predicciones así como los errores

Lag 5

Predicción t

Predicción 7 días adelante

SVR

Lag 3

Predicción t

Predicción 7 días adelante

Lag 5

Predicción t

Predicción 7 días adelante

Lasso

(1 / (2 n_samples)) ||y - Xw||^2_2 + alpha * ||w||_1

Lag 3

Predicción t

Predicción 7 días adelante

Lag 5

Predicción t

Predicción 7 días adelante

Gradient Boosting Regressor

La idea de este modelo es construir árboles en serie de forma que un árbol posterior intenta corregir los errores de todos los anteriores. Parámetros importantes son la profundidad de los árboles, cuándo hacer pre-prunning (útil para evitar el overfitting) y también el ratio de aprendizaje o learning_rate que controla como se esfuerza el árbol actual en corregir los errores de los árboles anteriores. También podemos aumentar el número de árboles con el parámetro n_estimators. Al contrario que en random forest, usar un número de árboles muy alto en gradient llevará a un modelo mucho más complejo que puede caer en overfitting. Max_depth suele variar entre 1 y 5

Lag 3

Predicción t

Predicción 7 días adelante

Lag 5

Predicción t

Predicción 7 días adelante

Elastic Net

Minimiza la función objetivo:

1 / (2 n_samples) ||y - Xw||^2_2 + alpha l1_ratio ||w||_1 + 0.5 alpha (1 - l1_ratio) * ||w||^2_2 =

a ||w||_1 + 0.5 b * ||w||_2^2 donde

alpha = a + b y l1_ratio = a / (a + b)

Lag 3

Predicción t

Predicción 7 días adelante

Lag 5

Predicción t

Predicción 7 días adelante

Tablas de errores

CrossValidation

Para cada uno de los modelos hemos obtenido los mejores hiperparámetros. Ahora volveremos a entrenar los modelos usando validación cruzada de 10 pliegues (time series) y obteniendo para cada pliegue los errores RMSE, MAE y R^2

Listas para añadir los errores de los splits para cada modelo en cada lag

Una vez obtenidos todos los errores para cada uno de los modelos entonces creamos 6 dataframes, uno por error, tres para lag3 y otros tres para lag5. Las columnas son los modelos y las filas son los resultados de cada uno de los 10 folds

Lista para guardar los coeficientes de correlación

Para obtener los coeficientes de correlación en la crossvalidación usamos la función split que devuelve un generador. Iterando sobre este obtenemos los índices generados para los conjuntos de train y validación en cada split. Nos interesa saber la predicción que se hace sobre el conjunto de validación, así que nos quedamos con esos íncides. Como el array es de la forma ([indices_train],[indices_validacion]) cogemos el segundo elemento de cada array

Para el caso de lag 3

Obtenemos los conjuntos con los que haremos las predicciones y la predicción correspondiente

Para el caso de lag 5

Conjuntos con los que haremos las predicciones

Función para añadir los coeficientes de correlación calculados en cada split a una lista

Random Forest

Linear Regression

Lasso

SVR

Gradient Boosting Regressor

Elastic Net

Creación tablas crossvalidacion

RMSE

Creamos los dataframes con los errores y los guardamos

MAE

CC

Test

RMSE

MAE

CC

Gráficas Train

Dado un modelo de lag (3 o 5), la siguiente función calcula las gráficas con la predicción real, la predicción en t y la predicción en t+1. Para el valor no existente en la predicción t+1 le asignamos el valor 0, que es el primer día que aparece en la gráfica

Random Forest

Linear Regression

Lasso

Gradient Boosting Regressor

SVR

Elastic Net

Cálculo de errores t+1 (train y test)

Guardamos en estas listas los errores producidos en train y test. Observar que los de test en t+1 ya los tenemos calculados porque recogimos los errores RMSE, MAE y CC a medida que íbamos prediciendo

Train

Obtenemos para cada modelo (lag3, lag5) el error en la predicción en train en t+1

Llamamos a la función para cada modelo y añadir los errores a las listas correspondientes

Test

Obtenemos para cada modelo (lag3, lag5) el error en la predicción en test en t+1

RMSE

MAE

CC